import Layout from "/@ts/layouts/index.vue";
import ParentView from "/@ts/components/ParentView/index.vue";
import InnerLink from "/@ts/components/InnerLink/index.vue";
import auth from "/@ts/plugins/auth";
// 遍历后台传来的路由字符串，转换为组件对象
export function filterAsyncRouter(
    asyncRouterMap: any,
    lastRouter = false,
    type = false,
  ) {
    return asyncRouterMap.filter((route: any) => {
      if (type && route.children) {
        route.children = filterChildren(route.children);
      }
      if (route.component) {
        // Layout ParentView 组件特殊处理
        if (route.component === "Layout") {
          route.component = Layout;
        } else if (route.component === "ParentView") {
          route.component = ParentView;
        } else if (route.component === "InnerLink") {
          route.component = InnerLink;
        } else {
          route.component = loadView(route.component);
        }
      }
      if (route.children != null && route.children && route.children.length) {
        route.children = filterAsyncRouter(route.children, route, type);
      } else {
        delete route["children"];
        delete route["redirect"];
      }
      return true;
    });
  }

  function filterChildren(childrenMap: any, lastRouter?: any) {
    var children: any = [];
    childrenMap.forEach((el: any, index: Number) => {
      if (el.children && el.children.length) {
        if (el.component === "ParentView" && !lastRouter) {
          el.children.forEach((c: any) => {
            c.path = el.path + "/" + c.path;
            if (c.children && c.children.length) {
              children = children.concat(filterChildren(c.children, c));
              return;
            }
            children.push(c);
          });
          return;
        }
      }
      if (lastRouter) {
        el.path = lastRouter.path + "/" + el.path;
      }
      children = children.concat(el);
    });
    return children;
  }
  
  
// 动态路由遍历，验证是否具备权限
export function filterDynamicRoutes(routes: any) {
    const res: any = [];
    routes.forEach((route: any) => {
      if (route.permissions) {
        if (auth.hasPermiOr(route.permissions)) {
          res.push(route);
        }
      } else if (route.roles) {
        if (auth.hasRoleOr(route.roles)) {
          res.push(route);
        }
      }
    });
    return res;
  }
  const _import = (path: string) => import(import.meta.env.VITE_BASE+`src/views/${path}.vue`);
  const views = import.meta.glob("/src/views/**/**/*.vue");
  const routerMap: any = {};
  for (const key in views) {
    if (Object.prototype.hasOwnProperty.call(views, key)) {
      const element = views[key];
      const routerPath = key.replace("/src/views/", "").replace(".vue", "");
      routerMap[routerPath] = element;
    }
  }
  export const loadView = (view: any) => {
    if (import.meta.env.VITE_NODE_ENV === "development") {
      return  _import(view);
    } else {
      return routerMap[view];
    }
  };
  